home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML Authority.sea / XML Authority / Required / swingall.jar / javax / swing / text / GapContent.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-07-15  |  6.8 KB  |  386 lines

  1. package javax.swing.text;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.Serializable;
  6. import java.util.Vector;
  7. import javax.swing.undo.UndoableEdit;
  8.  
  9. public class GapContent extends GapVector implements AbstractDocument.Content, Serializable {
  10.    private static final char[] empty = new char[0];
  11.    private transient MarkVector marks;
  12.    private transient MarkData search;
  13.    private transient int unusedMarks;
  14.  
  15.    public GapContent() {
  16.       this(10);
  17.    }
  18.  
  19.    public GapContent(int var1) {
  20.       super(Math.max(var1, 2));
  21.       char[] var2 = new char[]{'\n'};
  22.       ((GapVector)this).replace(0, 0, var2, var2.length);
  23.       this.marks = new MarkVector();
  24.       this.search = new MarkData(this, 0);
  25.    }
  26.  
  27.    // $FF: synthetic method
  28.    static int access$0(GapContent var0) {
  29.       return var0.unusedMarks;
  30.    }
  31.  
  32.    // $FF: synthetic method
  33.    static void access$1(GapContent var0, int var1) {
  34.       var0.unusedMarks = var1;
  35.    }
  36.  
  37.    protected Object allocateArray(int var1) {
  38.       return new char[var1];
  39.    }
  40.  
  41.    final int compare(MarkData var1, MarkData var2) {
  42.       if (var1.index < var2.index) {
  43.          return -1;
  44.       } else {
  45.          return var1.index > var2.index ? 1 : 0;
  46.       }
  47.    }
  48.  
  49.    public Position createPosition(int var1) throws BadLocationException {
  50.       if (this.unusedMarks > Math.max(5, this.marks.size() / 10)) {
  51.          this.removeUnusedMarks();
  52.       }
  53.  
  54.       int var2 = ((GapVector)this).getGapStart();
  55.       int var3 = ((GapVector)this).getGapEnd();
  56.       int var4 = var1 < var2 ? var1 : var1 + (var3 - var2);
  57.       MarkData var5 = new MarkData(this, var4);
  58.       int var6 = this.findSortIndex(var5);
  59.       this.marks.insertElementAt(var5, var6);
  60.       return new StickyPosition(this, var5);
  61.    }
  62.  
  63.    final int findMarkAdjustIndex(int var1) {
  64.       this.search.index = Math.max(var1, 1);
  65.       int var2 = this.findSortIndex(this.search);
  66.  
  67.       for(int var3 = var2 - 1; var3 >= 0; --var3) {
  68.          MarkData var4 = this.marks.elementAt(var3);
  69.          if (var4.index != this.search.index) {
  70.             break;
  71.          }
  72.  
  73.          --var2;
  74.       }
  75.  
  76.       return var2;
  77.    }
  78.  
  79.    final int findSortIndex(MarkData var1) {
  80.       int var2 = 0;
  81.       int var3 = this.marks.size() - 1;
  82.       int var4 = 0;
  83.       if (var3 == -1) {
  84.          return 0;
  85.       } else {
  86.          int var5 = 0;
  87.          MarkData var6 = this.marks.elementAt(var3);
  88.          var5 = this.compare(var1, var6);
  89.          if (var5 > 0) {
  90.             return var3 + 1;
  91.          } else {
  92.             while(var2 <= var3) {
  93.                var4 = var2 + (var3 - var2) / 2;
  94.                MarkData var7 = this.marks.elementAt(var4);
  95.                var5 = this.compare(var1, var7);
  96.                if (var5 == 0) {
  97.                   return var4;
  98.                }
  99.  
  100.                if (var5 < 0) {
  101.                   var3 = var4 - 1;
  102.                } else {
  103.                   var2 = var4 + 1;
  104.                }
  105.             }
  106.  
  107.             return var5 < 0 ? var4 : var4 + 1;
  108.          }
  109.       }
  110.    }
  111.  
  112.    protected int getArrayLength() {
  113.       char[] var1 = (char[])((GapVector)this).getArray();
  114.       return var1.length;
  115.    }
  116.  
  117.    public void getChars(int var1, int var2, Segment var3) throws BadLocationException {
  118.       if (var1 < 0) {
  119.          throw new BadLocationException("Invalid location", -1);
  120.       } else if (var1 + var2 > this.length()) {
  121.          throw new BadLocationException("Invalid location", this.length() + 1);
  122.       } else {
  123.          int var4 = ((GapVector)this).getGapStart();
  124.          int var5 = ((GapVector)this).getGapEnd();
  125.          char[] var6 = (char[])((GapVector)this).getArray();
  126.          if (var1 + var2 <= var4) {
  127.             var3.array = var6;
  128.             var3.offset = var1;
  129.          } else if (var1 >= var4) {
  130.             var3.array = var6;
  131.             var3.offset = var5 + var1 - var4;
  132.          } else {
  133.             var3.array = new char[var2];
  134.             var3.offset = 0;
  135.             int var7 = var4 - var1;
  136.             System.arraycopy(var6, var1, var3.array, 0, var7);
  137.             System.arraycopy(var6, var5, var3.array, var7, var2 - var7);
  138.          }
  139.  
  140.          var3.count = var2;
  141.       }
  142.    }
  143.  
  144.    protected Vector getPositionsInRange(Vector var1, int var2, int var3) {
  145.       int var4 = var2 + var3;
  146.       int var7 = ((GapVector)this).getGapStart();
  147.       int var8 = ((GapVector)this).getGapEnd();
  148.       int var5;
  149.       int var6;
  150.       if (var2 < var7) {
  151.          if (var2 == 0) {
  152.             var5 = 0;
  153.          } else {
  154.             var5 = this.findMarkAdjustIndex(var2);
  155.          }
  156.  
  157.          if (var4 >= var7) {
  158.             var6 = this.findMarkAdjustIndex(var4 + (var8 - var7) + 1);
  159.          } else {
  160.             var6 = this.findMarkAdjustIndex(var4 + 1);
  161.          }
  162.       } else {
  163.          var5 = this.findMarkAdjustIndex(var2 + (var8 - var7));
  164.          var6 = this.findMarkAdjustIndex(var4 + (var8 - var7) + 1);
  165.       }
  166.  
  167.       Vector var9 = var1 == null ? new Vector(Math.max(1, var6 - var5)) : var1;
  168.  
  169.       for(int var10 = var5; var10 < var6; ++var10) {
  170.          var9.addElement(new UndoPosRef(this, this.marks.elementAt(var10)));
  171.       }
  172.  
  173.       return var9;
  174.    }
  175.  
  176.    public String getString(int var1, int var2) throws BadLocationException {
  177.       Segment var3 = new Segment();
  178.       this.getChars(var1, var2, var3);
  179.       return new String(var3.array, var3.offset, var3.count);
  180.    }
  181.  
  182.    public UndoableEdit insertString(int var1, String var2) throws BadLocationException {
  183.       if (var1 >= this.length()) {
  184.          throw new BadLocationException("Invalid insert", this.length());
  185.       } else {
  186.          char[] var3 = var2.toCharArray();
  187.          ((GapVector)this).replace(var1, 0, var3, var3.length);
  188.          return new InsertUndo(this, var1, var2.length());
  189.       }
  190.    }
  191.  
  192.    public int length() {
  193.       int var1 = this.getArrayLength() - (((GapVector)this).getGapEnd() - ((GapVector)this).getGapStart());
  194.       return var1;
  195.    }
  196.  
  197.    private void readObject(ObjectInputStream var1) throws ClassNotFoundException, IOException {
  198.       var1.defaultReadObject();
  199.       this.marks = new MarkVector();
  200.       this.search = new MarkData(this, 0);
  201.    }
  202.  
  203.    public UndoableEdit remove(int var1, int var2) throws BadLocationException {
  204.       if (var1 + var2 >= this.length()) {
  205.          throw new BadLocationException("Invalid remove", this.length() + 1);
  206.       } else {
  207.          String var3 = this.getString(var1, var2);
  208.          RemoveUndo var4 = new RemoveUndo(this, var1, var3);
  209.          ((GapVector)this).replace(var1, var2, empty, 0);
  210.          return var4;
  211.       }
  212.    }
  213.  
  214.    final void removeUnusedMarks() {
  215.       int var1 = this.marks.size();
  216.       MarkVector var2 = new MarkVector(var1);
  217.  
  218.       for(int var3 = 0; var3 < var1; ++var3) {
  219.          MarkData var4 = this.marks.elementAt(var3);
  220.          if (!var4.unused) {
  221.             var2.addElement(var4);
  222.          }
  223.       }
  224.  
  225.       this.marks = var2;
  226.       this.unusedMarks = 0;
  227.    }
  228.  
  229.    protected void resetMarksAtZero() {
  230.       if (this.marks != null && ((GapVector)this).getGapStart() == 0) {
  231.          int var1 = ((GapVector)this).getGapEnd();
  232.          int var2 = 0;
  233.  
  234.          for(int var3 = this.marks.size(); var2 < var3; ++var2) {
  235.             MarkData var4 = this.marks.elementAt(var2);
  236.             if (var4.index > var1) {
  237.                break;
  238.             }
  239.  
  240.             var4.index = 0;
  241.          }
  242.       }
  243.  
  244.    }
  245.  
  246.    protected void shiftEnd(int var1) {
  247.       int var2 = ((GapVector)this).getGapEnd();
  248.       super.shiftEnd(var1);
  249.       int var3 = ((GapVector)this).getGapEnd() - var2;
  250.       int var4 = this.findMarkAdjustIndex(var2);
  251.       int var5 = this.marks.size();
  252.  
  253.       for(int var6 = var4; var6 < var5; ++var6) {
  254.          MarkData var7 = this.marks.elementAt(var6);
  255.          var7.index += var3;
  256.       }
  257.  
  258.    }
  259.  
  260.    protected void shiftGap(int var1) {
  261.       int var2 = ((GapVector)this).getGapStart();
  262.       int var3 = var1 - var2;
  263.       int var4 = ((GapVector)this).getGapEnd();
  264.       int var5 = var4 + var3;
  265.       int var6 = var4 - var2;
  266.       super.shiftGap(var1);
  267.       if (var3 > 0) {
  268.          int var7 = this.findMarkAdjustIndex(var2);
  269.          int var8 = this.marks.size();
  270.  
  271.          for(int var9 = var7; var9 < var8; ++var9) {
  272.             MarkData var10 = this.marks.elementAt(var9);
  273.             if (var10.index >= var5) {
  274.                break;
  275.             }
  276.  
  277.             var10.index -= var6;
  278.          }
  279.       } else if (var3 < 0) {
  280.          int var11 = this.findMarkAdjustIndex(var1);
  281.          int var12 = this.marks.size();
  282.  
  283.          for(int var13 = var11; var13 < var12; ++var13) {
  284.             MarkData var14 = this.marks.elementAt(var13);
  285.             if (var14.index >= var4) {
  286.                break;
  287.             }
  288.  
  289.             var14.index += var6;
  290.          }
  291.       }
  292.  
  293.       this.resetMarksAtZero();
  294.    }
  295.  
  296.    protected void shiftGapEndUp(int var1) {
  297.       int var2 = this.findMarkAdjustIndex(((GapVector)this).getGapEnd());
  298.       int var3 = this.marks.size();
  299.  
  300.       for(int var4 = var2; var4 < var3; ++var4) {
  301.          MarkData var5 = this.marks.elementAt(var4);
  302.          if (var5.index >= var1) {
  303.             break;
  304.          }
  305.  
  306.          var5.index = var1;
  307.       }
  308.  
  309.       super.shiftGapEndUp(var1);
  310.       this.resetMarksAtZero();
  311.    }
  312.  
  313.    protected void shiftGapStartDown(int var1) {
  314.       int var2 = this.findMarkAdjustIndex(var1);
  315.       int var3 = this.marks.size();
  316.       int var4 = ((GapVector)this).getGapStart();
  317.       int var5 = ((GapVector)this).getGapEnd();
  318.  
  319.       for(int var6 = var2; var6 < var3; ++var6) {
  320.          MarkData var7 = this.marks.elementAt(var6);
  321.          if (var7.index > var4) {
  322.             break;
  323.          }
  324.  
  325.          var7.index = var5;
  326.       }
  327.  
  328.       super.shiftGapStartDown(var1);
  329.       this.resetMarksAtZero();
  330.    }
  331.  
  332.    protected void updateUndoPositions(Vector var1, int var2, int var3) {
  333.       int var4 = var2 + var3;
  334.       int var5 = ((GapVector)this).getGapEnd();
  335.       int var7 = this.findMarkAdjustIndex(var5 + 1);
  336.       int var6;
  337.       if (var2 != 0) {
  338.          var6 = this.findMarkAdjustIndex(var5);
  339.       } else {
  340.          var6 = 0;
  341.       }
  342.  
  343.       for(int var8 = var1.size() - 1; var8 >= 0; --var8) {
  344.          UndoPosRef var9 = (UndoPosRef)var1.elementAt(var8);
  345.          var9.resetLocation(var4, var5);
  346.       }
  347.  
  348.       if (var6 < var7) {
  349.          Object[] var13 = new Object[var7 - var6];
  350.          int var10 = 0;
  351.          if (var2 == 0) {
  352.             for(int var15 = var6; var15 < var7; ++var15) {
  353.                MarkData var18 = this.marks.elementAt(var15);
  354.                if (var18.index == 0) {
  355.                   var13[var10++] = var18;
  356.                }
  357.             }
  358.  
  359.             for(int var16 = var6; var16 < var7; ++var16) {
  360.                MarkData var19 = this.marks.elementAt(var16);
  361.                if (var19.index != 0) {
  362.                   var13[var10++] = var19;
  363.                }
  364.             }
  365.          } else {
  366.             for(int var11 = var6; var11 < var7; ++var11) {
  367.                MarkData var12 = this.marks.elementAt(var11);
  368.                if (var12.index != var5) {
  369.                   var13[var10++] = var12;
  370.                }
  371.             }
  372.  
  373.             for(int var14 = var6; var14 < var7; ++var14) {
  374.                MarkData var17 = this.marks.elementAt(var14);
  375.                if (var17.index == var5) {
  376.                   var13[var10++] = var17;
  377.                }
  378.             }
  379.          }
  380.  
  381.          this.marks.replaceRange(var6, var7, var13);
  382.       }
  383.  
  384.    }
  385. }
  386.